import datetime
import os

import pandas as pd

from BZ处理 import process_bz_vouchers
from LogConfig import getLog
from WE_RE处理 import process_we_re_vouchers

logger = getLog("表格处理")


def format_date(date_value):
    """将日期格式化为'年 月 日'格式"""
    if isinstance(date_value, str):
        date_value = pd.to_datetime(date_value)
    return date_value.strftime('%Y年%m月%d日')


def get_days_diff(date1, date2):
    """计算两个日期之间的天数差"""
    return abs((date1 - date2).days)


def log_with_company(公司代码, level, message):
    """带公司代码前缀的日志输出"""
    full_message = f"[{公司代码}] {message}"
    if level == "error":
        logger.error(full_message)
    elif level == "debug":
        logger.debug(full_message)
    elif level == "info":
        logger.info(full_message)


def process_excel_file(公司代码, input_path, template_path):
    try:
        # 检查输入文件是否存在
        if not os.path.exists(input_path):
            log_with_company(公司代码, "error", f"输入文件不存在: {input_path}")
            return None

        # 检查模板文件是否存在
        if not os.path.exists(template_path):
            log_with_company(公司代码, "error", f"模板文件不存在: {template_path}")
            return None

        # 读取下载的Excel文件，指定凭证编号列为字符串格式
        df = pd.read_excel(input_path, dtype={'凭证编号': str, '分配': str})
        log_with_company(公司代码, "info", f"成功读取Excel文件，共{len(df)}条记录")

        # 读取模板文件
        template_df = pd.read_excel(template_path)
        log_with_company(公司代码, "info", f"成功读取模板文件，共{len(template_df)}列")

        # 获取当前日期
        current_date = datetime.datetime.now()

        # 首先统计凭证类型，统计出一个列表
        voucher_types = df['凭证类型'].value_counts().to_dict()
        log_with_company(公司代码, "info", f"开始处理，凭证类型统计：{voucher_types}")

        write_data = []

        if 'BZ' in voucher_types:
            # 处理BZ类型凭证
            bz_data = process_bz_vouchers(公司代码, df, current_date)
            write_data.extend(bz_data)

        if 'WE' in voucher_types and 'RE' in voucher_types:
            # 处理WE/RE类型凭证
            we_re_data = process_we_re_vouchers(公司代码, df, current_date)
            write_data.extend(we_re_data)

        # 将数据写入模板文件
        if write_data:
            log_with_company(公司代码, "info", f"准备写入{len(write_data)}条记录")
            result_df = pd.DataFrame(write_data)

            # 确保输出目录存在
            output_dir = os.path.dirname(input_path)
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)

            # 保存结果文件
            output_path = input_path.replace('.xlsx', '_需检查项.xlsx')
            result_df.to_excel(output_path, index=False)

            # 验证文件是否成功保存
            if os.path.exists(output_path):
                log_with_company(公司代码, "info", f"处理完成，结果已保存至: {output_path}")
                return output_path
            else:
                log_with_company(公司代码, "error", f"文件保存失败: {output_path}")
                return None
        else:
            log_with_company(公司代码, "info", "没有符合条件的数据需要写入")
            return None

    except Exception as e:
        log_with_company(公司代码, "error", f"处理过程中发生错误: {str(e)}")
        return None


if __name__ == '__main__':
    公司代码 = "6691"
    inputP = r"C:\Users\86133\PycharmProjects\往来事务码检查程序\download\测试\6791_EXPORT.xlsx"
    templateP = r"往来事务码检查导出底稿.xlsx"
    process_excel_file(公司代码, inputP, templateP)
